Есть возможность обрабатывать сообщение в одном месте OnTabChange(). Идея основана на том, что все наши страницы порождены от класса CDialog. Давайте заведем на него указатель:
class CTestTabDlg : public CDialog
{
// Construction
public:
CDialog* mDlg;
......
};
И присвоим этому указателю тот диалог, который виден, то есть первый.
...... tci.mask = TCIF_PARAM; tci.lParam = (LPARAM)Page1; m_Tabs.SetItem(0, &tci); Page1->Create(CTabPage1::IDD, &m_Tabs); Page1->SetWindowPos(NULL, 40, 40, 0, 0, SWP_NOSIZE | SWP_NOZORDER); Page1->ShowWindow(SW_SHOW); mDlg=Page1; ......
И переделаем реакцию на сообщение о смене закладки:
void CTestTabDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
if(mDlg)
{
mDlg->ShowWindow(SW_HIDE);
}
switch(m_Tabs.GetCurSel())
{
case 0:
mDlg = Page1;
break;
case 1:
mDlg = Page2;
break;
}
if(mDlg)
{
mDlg->ShowWindow(SW_SHOW);
}
}
Как видите мы прячем текущую закладку, потом в зависимости от того какая страница текущая присваиваем mDlg указатель на диалог, который и выводим. Не знаю чем этот способ лучше или хуже, но надо обрабатывать всего одно событие.